package tools

import (
	"fmt"
	"github.com/yuin/gluamapper"
	lua "github.com/yuin/gopher-lua"
	"log"
	"os"
	"path"
	"path/filepath"
	"strings"
	"sync"
)

var LuaConfigMap sync.Map
var LastKey string

type VarTools struct {
}

var VarToolsObject VarTools

func (v VarTools) InitLuaConfigMap() {

	L := lua.NewState()
	defer L.Close()
	// 打开标准库
	L.OpenLibs()

	//fmt.Println("real GOMAXPROCS", runtime.GOMAXPROCS(-1))

	rootDir := "api/dance_server_new/config"
	// 创建一个切片，用于存储找到的文件路径
	var filePaths []string
	// 使用filepath.Walk函数遍历目录
	err := filepath.Walk(rootDir, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			// 如果在遍历过程中遇到错误，返回该错误以停止遍历
			return err
		}
		// 如果当前路径是一个文件（而非目录）
		if !info.IsDir() {
			// 将文件路径添加到切片中
			filePaths = append(filePaths, path)
		}
		// 继续遍历子目录（如果需要停止遍历子目录，则返回filepath.SkipDir）
		return nil
	})
	// 检查遍历过程中是否发生错误
	if err != nil {
		log.Fatalf("遍历目录时出错: %v", err)
	}

	load := func(configFile, tmpKey string) {

		//l1 := new(LuaMatcher)
		//l1 := NewLuaMatcher()
		//L.InitClient(configFile) // path是你存放lua文件的路径
		if err := L.DoFile(configFile); err != nil {
			panic(err)
		}
		Table := L.GetGlobal(tmpKey) //获取table

		L.Push(Table)
		t := L.CheckTable(-1)

		LastKey = tmpKey
		t.ForEach(PrintKeyValue) //遍历打印
		LastKey = ""
		if value, ok := LuaConfigMap.Load(tmpKey); ok {
			fmt.Println(fmt.Sprintf("LuaConfigMap :%+v", value))
		} else {
			fmt.Println(3333)
		}
	}
	// 打印收集到的所有文件路径
	for _, filePath := range filePaths {

		fileName := path.Base(filePath)
		if strings.Contains(filePath, "\\") {
			split := strings.Split(fileName, "\\")
			if len(split) <= 1 {
				panic("aaa")
			}
			fileName = split[len(split)-1]
			filePath = strings.Join(split, "/")
		} else if strings.Contains(filePath, "/") {
			split := strings.Split(fileName, "/")
			if len(split) <= 1 {
				panic("bbbb")
			}
			fileName = split[len(split)-1]
		}

		if !strings.Contains(fileName, ".lua") {
			panic(fmt.Sprintf("数据异常"))
		}
		baseName := strings.TrimSuffix(fileName, ".lua")

		fmt.Println(filePath)
		//replaced := strings.ReplaceAll(filePath, "\\", "/")
		load(filePath, baseName)
		// 在此处可以添加加载文件的逻辑，例如使用os.Open打开文件
	}
	//configFile := "api/dance_server_new/config/Active.lua"
	// 加载并执行Lua脚本
	//if err := L.DoFile(configFile); err != nil {
	//	panic(err)
	//}
	////l1 := new(LuaMatcher)
	//l1 := NewLuaMatcher()
	//l1.InitClient(configFile)                // path是你存放lua文件的路径
	//Table := l1.LuaState.GetGlobal("Active") //获取table
	//
	//l1.LuaState.Push(Table)
	//t := l1.LuaState.CheckTable(-1)
	//
	//LastKey = "Active"
	//t.ForEach(l1.PrintKeyValue) //遍历打印
	//LastKey = ""
	//
	//if value, ok := LuaConfigMap.Load("Active"); ok {
	//	fmt.Println(fmt.Sprintf("LuaConfigMap :%+v", value))
	//} else {
	//	fmt.Println(3333)
	//}
	//初始化
	//env := os.Getenv("ENV_SERVER")
	//if "pro" == env {
	//
	//} else {
	//
	//}
}

//type LuaMatcher struct {
//	LuaState *lua.LState
//}
//
//func NewLuaMatcher() *LuaMatcher {
//	return &LuaMatcher{
//		LuaState: nil,
//	}
//}

//func (L *LuaMatcher) InitClient(path string) bool {
//
//	L.LuaState = lua.NewState()
//	err := L.LuaState.DoFile(path)
//	if err != nil {
//		glog.Error("lua init fail")
//		return false
//	}
//	return true
//}

func PrintKeyValue(L1 lua.LValue, L2 lua.LValue) {
	if lv, ok := L2.(*lua.LTable); ok {
		//lv.ForEach(L1, L2) //递归调用ForEach函数
		tmp := make(map[string]interface{})
		//person := make(map[interface{}]interface{}, 0)
		if err := gluamapper.Map(lv, &tmp); err != nil {
			panic(err)
		} else {
			fmt.Println(tmp)
		}

		if value, ok := LuaConfigMap.Load(LastKey); ok {
			fmt.Println("key1:", value)

			if dailyStoreHoursMap, ok := value.([]map[string]interface{}); ok {
				dailyStoreHoursMap = append(dailyStoreHoursMap, tmp)
				LuaConfigMap.Store(LastKey, dailyStoreHoursMap)
			} else {
				//r.logger.LogError("dailyStoreHoursMap转换失败", logStruct)
				fmt.Sprintf("执行数据失败")
			}
		} else {
			fmt.Println("key1 not found")
			dailyStoreHoursMap := make([]map[string]interface{}, 0)
			dailyStoreHoursMap = append(dailyStoreHoursMap, tmp)
			LuaConfigMap.Store(LastKey, dailyStoreHoursMap)
		}
		fmt.Println(L1)
		fmt.Println(L2)
		fmt.Println(*lv)
	} else {
		fmt.Println("k = ", L1) //注意这里是函数传进来的参数
		fmt.Println("v = ", L2)
	}
}
